//
//  HomeTableViewController.swift
//  SinaWeiBo
//
//  Created by gxiangzi on 15/8/31.
//  Copyright © 2015年 hqu. All rights reserved.
//

import UIKit
import SVProgressHUD


class HomeTableViewController: BaseTableViewController {

   private lazy var statuslistViewModel = StatusListViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !UserAccountViewModel.sharedUserAccount.userLogon {
            visitor?.setInfo(nil, labelText: nil)
            return 
        }
        
        /*
            参数1: 通知名称
            参数2： 接受发送通知的对象， nil 为任何人
            参数3: 接受到通知后执行的队列 nil 为当前队列
            参数4: 执行的代码快
        */
        
        NSNotificationCenter.defaultCenter().addObserverForName(StatusPictureViewSelectedPhotoNotification, object: nil, queue: NSOperationQueue.mainQueue()) { [weak self] (notification) -> Void in
            
        }
        
        prepareTableView()
        
        loadData()
    }
    
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    private func prepareTableView() {
        
        // 以下两句就可以自动处理行高， 可能会出现一部分问题
        tableView.estimatedRowHeight = 200
        //        tableView.rowHeight = UITableViewAutomaticDimension
        
        tableView.rowHeight = 200
        
        tableView.registerClass(StatusForwordCell.self, forCellReuseIdentifier: GXStatusForwardCell)
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: GXStatusNormalCell)
        
        // 刷新的控件
        refreshControl = RefreshControl()
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 上拉提示控件
        tableView.tableFooterView = pullUpView
        
    }
    
    /// 结束刷新数据
    private func endLoadData() {
        // 关闭刷新控件
        self.refreshControl?.endRefreshing()
        // 关闭上拉刷新动画
        self.pullUpView.stopAnimating()
    }
    
    // 加载数据
    @objc func loadData() {
        
        print("-------")
        
        refreshControl?.beginRefreshing()
        
        // 先考虑上拉刷新 isPullupRefresh = false
        statuslistViewModel.loadStatuses(isPullupRefresh: pullUpView.isAnimating()).subscribeError({ (error) -> Void in
            
            self.endLoadData()
            SVProgressHUD.showErrorWithStatus("您的网络不给力")
        
            }) { () -> Void in
                
                self.endLoadData()
                self.tableView.reloadData()
                
        }
    }
    
    
    private var pullUpView : UIActivityIndicatorView = {
        let indector = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge);
        indector.color = UIColor.darkGrayColor()
        
        return indector
    }()
    
}

extension HomeTableViewController {
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuslistViewModel.statuses.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let ViewModel = statuslistViewModel.statuses[indexPath.row] as! StatusViewModel
        
        let cell = self.tableView.dequeueReusableCellWithIdentifier(ViewModel.cellID(), forIndexPath: indexPath) as! StatusCell
        
        // 判断是否是 数据模型的最后一项，如果是，就考试上拉动画
        if(indexPath.row == statuslistViewModel.statuses.count - 1) && !pullUpView.isAnimating()
        {
            printLog("显示上拉视图...")
            pullUpView.startAnimating()
            
            // 加载数据
            loadData()
            
        }
        
        cell.statusViewModel = ViewModel
        
        return cell
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        // 0. 获得模型
        let viewModel = statuslistViewModel.statuses[indexPath.row] as! StatusViewModel
        
        // 1. 判断视图模型的行高是否为0，如果不为0，表示行高已经缓存
        if viewModel.rowHeight > 0 {
//            printLog("返回缓存行高")
            return viewModel.rowHeight
        }
        
        // 2. 获得 cell，不能使用 indexPath 的方法，否则会出现死循环
        let cell = tableView.dequeueReusableCellWithIdentifier(viewModel.cellID()) as! StatusCell
        
        // 3. 记录行高
        viewModel.rowHeight = cell.rowHeight(viewModel)
        
        return viewModel.rowHeight
 
    }
    
//    override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
//        tableView.reloadData()
//    }
    
    
    
}
